-- 迭代器测试
--[[
    迭代器（iterator）是一种对象，它能够用来遍历标准模板库容器中的部分或全部元素，每个迭代器对象代表容器中的确定的地址。
    在 Lua 中迭代器是一种支持指针类型的结构，它可以遍历集合的每一个元素。
--]]
array = {"Google", "Runoob"}

for key, value in ipairs(array) do
    print(key, value)
end

-- 无状态的迭代器 多状态的迭代器

--[[
    无状态的迭代器是指不保留任何状态的迭代器，因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
每一次迭代，迭代函数都是用两个变量（状态常量和控制变量）的值作为参数被调用，一个无状态的迭代器只利用这两个值可以获取下一个元素。
这种无状态迭代器的典型的简单的例子是 ipairs，它遍历数组的每一个元素。
]]
-- 自定义无状态迭代器函数，实现n的平方
function square(iteratorMaxCount, currentNumber)
    if currentNumber < iteratorMaxCount then
        currentNumber = currentNumber + 1
        return currentNumber, currentNumber * currentNumber
    end
end

for i, n in square, 3, 0 do
    print(i, n)
end

function iter(a, i)
    i = i + 1
    local v = a[i]
    if v then
        return i, v
    end
end

function my_ipairs(a)
    return iter, a, 0
end

for index, value in my_ipairs(array) do
    print(index, value)
end

-- 自定义多状态迭代器

function elementIterator(collection)
    local index = 0
    local count = #collection
    -- 闭包函数 *
    return function ()
        index = index + 1
        if index <= count then
            -- 返回迭代器当前元素
            return collection[index]
        end
    end
end

for element in elementIterator(array) do
    print(element)
end